/**
 * 项目名：	Rumba Plan
 * 
 * 版权所有(C)，上海海鼎信息工程股份有限公司，2007，所有权利保留。
 * 
 * 文件名：	DBCommand.java
 * 模块说明：	
 * 修改历史：
 * 2007-2-26 - lxm - 创建。
 */
package com.hd123.rumba.upgrade;

import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;

import net.sf.hibernate.HibernateException;
import net.sf.hibernate.Session;

import org.apache.log4j.Logger;

import com.hd123.rumba.exception.BusinessException;
import com.hd123.rumba.runtime.HibernateSession;

/**
 * 提供执行指定数据库命令(SQL)的功能。
 * 
 * @author lxm
 * 
 */
public class DBCommand {

  private StringBuffer _sqls = new StringBuffer();
  private Session session;
  private Connection dbConn;
  private Logger logger = Logger.getLogger(DBCommand.class);

  /** 属性：对应的Hibernate数据库Session。 */
  public Session getSession() {
    return session;
  }

  /** 属性：对应的Hibernate数据库Session。 */
  public void setSession(Session session) {
    this.session = session;
  }

  /** 属性：命令sql列表。只读 */
  public StringBuffer sqls() {
    return _sqls;
  }

  /** 清除SQL命令列表{@link #sqls()}。 */
  public void clear() {
    _sqls.delete(0, _sqls.length());
  }

  /**
   * 执行sqls()中指定的SQL命令。
   * 
   * @throws BusinessException
   */
  public void exec() throws BusinessException {
    if (sqls() == null)
      return;
    String sql = sqls().toString();
    if (sql == null)
      return;
    exec(sql, false);
  }

  /**
   * 执行sqls()中指定的SQL命令。
   * 
   * @param ignore
   *          是否忽略执行过程中发生的错误。
   * @throws BusinessException
   */
  public void exec(boolean ignore) throws BusinessException {
    if (sqls() == null)
      return;
    String sql = sqls().toString();
    if (sql == null)
      return;
    exec(sql, ignore);
  }

  /**
   * 执行指定的SQL命令。
   * 
   * @param sql
   *          指定被指定的SQL命令。
   * @throws BusinessException
   * @throws HibernateException
   */
  public void exec(String sql) throws BusinessException {
    exec(sql, false);
  }

  /**
   * 执行指定的SQL命令。
   * 
   * @param sql
   *          指定被指定的SQL命令。
   * @param ignore
   *          是否忽略执行过程中发生的错误。
   * @throws BusinessException
   */
  public void exec(String sql, boolean ignore) throws BusinessException {
    checkToExec();
    _exec(sql, ignore);
  }

  private void checkToExec() throws BusinessException {
    if (session != null)
      return;
    try {
      session = HibernateSession.getSession();
    } catch (HibernateException e) {
      throw new BusinessException(e);
    }
  }

  private Connection getDbConn() throws BusinessException {
    if (dbConn == null) {
      try {
        dbConn = session.connection();
        if (!dbConn.getAutoCommit()) {
          dbConn.commit();
          dbConn.setAutoCommit(true);
        }
      } catch (HibernateException e) {
        throw new BusinessException(e);
      } catch (SQLException e) {
        throw new BusinessException(e);
      }
    }
    return dbConn;
  }

  private void _exec(String sql, boolean ignore) throws BusinessException {
    if (sql == null || "".equals(sql.trim()))
      return;

    Connection conn = getDbConn();
    try {
      Statement statement = conn.createStatement();
      try {
        logger.debug("执行SQL语句：" + sql);
        if (statement != null)
          statement.executeUpdate(sql);
      } finally {
        statement.close();
      }
    } catch (SQLException e) {
      if (!ignore)
        throw new BusinessException(e);
    }
  }

}
